import { hasOwn } from "../shared/index";

/**
 * 公共属性映射字典
 */
const publicPropertiesMap = {
    $el: (instance) => {
        return instance.vnode.$el
    },
    $slots: (instance) => {
        return instance.slots
    }
}

/**
 * 公共组件代理对象 Handler
 */
export const PublicInstanceProxyHandlers = {
    get({ _: instance }, key) {
        const { setupState, props } = instance;

        // render 中绑定 setup 的返回值
        if (hasOwn(setupState, key))
            return setupState[key];
        
        // render 中绑定 setup 中 传入的 props
        if (hasOwn(props, key)) {
            return props[key];
        }

        // 通过一个 key 获取功能属性字典内的逻辑方法
        const publicGettter = publicPropertiesMap[key];
        if (publicGettter) {
            // 属性存在，调用方法逻辑，返回最终值
            return publicGettter(instance);
        }


        return undefined;
    }
}